﻿using System.Collections.Generic;
using System.Linq;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios.Conversores;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    public class ServicoDeTabelaPreco : IServicoDeTabelaPreco
    {
        private IRepositorioDeTabelaPreco _repositorio;

        private ValidadorDeTabelaPreco _validador;

        public ServicoDeTabelaPreco()
        {
            _repositorio = FabricaGenerica.Crie<IRepositorioDeTabelaPreco>();
            _validador = new ValidadorDeTabelaPreco(_repositorio);
        }

        public void Cadastre(DtoTabelaPreco objeto)
        {
            if (objeto != null)
            {
                var tabela = new ConversorDeTabelaDePreco().Converta(objeto);
                

                _validador.ValideGravacao(tabela);

                _repositorio.Cadastre(tabela);
            }
        }

        public void Atualize(DtoTabelaPreco objeto)
        {
            if (objeto != null)
            {
                var tabela = ConversorDeObjetos.Copie<TabelaPreco>(objeto);
                var itens = ConversorDeObjetos.Copie<ItemTabelaPreco, DtoItemTabelaPreco>(objeto.ItensTabela.ToList());
                for (int i = 0; i < itens.Count; i++)
                {
                    itens[i].DiasSemanaItemTabelaPrecos = ConversorDeObjetos.Copie<DiaSemanaItemTabelaPreco, DtoDiaSemanaItemTabelaPreco>(objeto.ItensTabela.ToList()[i].DiasSemanaItemTabelaPrecos.ToList());
                }

                tabela.ItemTabela = itens;

                _validador.ValideAtualizacao(tabela);

                _repositorio.Atualize(tabela);
            }
        }

        public void Exclua(int codigo)
        {
            if (codigo > 0)
            {
                var tabela = _repositorio.Consulte(t => t.Codigo == codigo).SingleOrDefault();

                if (tabela != null)
                {
                    _validador.ValideExclusao(tabela);

                    _repositorio.Exclua(tabela);
                }
            }
        }

        public DtoTabelaPreco Consulte(int codigo)
        {
            if (codigo > 0)
            {
                return ConversorDeObjetos.Copie<DtoTabelaPreco>(_repositorio.Consulte(t => t.Codigo == codigo).SingleOrDefault());
            }

            return null;
        }

        public IList<DtoTabelaPreco> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoTabelaPreco, TabelaPreco>(_repositorio.ConsulteTodos());
        }
    }
}
